# 导入正则表达式模块
import re


# match:在string主串中查找是否有pattern模式串，
#       有则返回比较对象，用.group方法来打印
#       无则返回None，这时进行.group方法打印会报错

def simple_compare():
    """
    简单匹配
    """
    result = re.match("wangdao", "wangdao.cn")
    if result:
        print(result.group())


def single_compare():
    # . 匹配任意1个字符(除了\n)
    ret = re.match(".", "M")
    print(ret.group())  # M
    ret = re.match("t.o", "too")
    print(ret.group())  # too
    ret = re.match("t.o", "two")
    print(ret.group())  # two

    print("-" * 50)

    # [] 匹配[]中列举的字符
    ret = re.match("[hH]", "hello Python")
    print(ret.group())  # h
    ret = re.match("[hH]", "Hello Python")
    print(ret.group())  # H
    ret = re.match("[hH]ello Python", "Hello Python")
    print(ret.group())  # Hello Python
    #    匹配0-9的数字
    ret = re.match("[0-9]Hello Python", "6Hello Python")
    print(ret.group())
    #    匹配0-3或5-9的数字
    ret = re.match("[0-35-9]Hello Python", "6Hello Python")
    print(ret.group())

    print("-" * 50)

    # \d 匹配数字，即0-9
    ret = re.match(r"嫦娥\d号", "嫦娥1号发射成功")
    print(ret.group())
    ret = re.match(r"嫦娥\d号", "嫦娥2号发射成功")
    print(ret.group())
    ret = re.match(r"嫦娥\d号", "嫦娥3号发射成功")
    print(ret.group())


def more_alp_compare():
    # * 匹配前一个字符出现0次或无限次，即可有可无
    ret = re.match("[A-Z][a-z]*", "M")
    print(ret.group())  # M
    ret = re.match("[A-Z][a-z]*", "MnnM")
    print(ret.group())  # Mnn
    ret = re.match("[A-Z][a-z]*", "Aabcdef")
    print(ret.group())  # Aabcdef

    print('-' * 50)

    # + 匹配前一个字符出现1次或者无限次，即至少有1次
    # \w 匹配单词字符，即a_z、A-Z、0-9、_
    names = ["name1", "_name", "2_name", "__name__"]
    for name in names:
        # 用于判断命名是否符合规范
        # 第一个字符必须为字母或者_
        ret = re.match(r'[a-zA-Z_]+\w*', name)
        if ret:
            print(f'{ret.group()} 是正确的')
        else:
            print(f'{name} 不符合命名规范')

    print("-" * 50)

    # ？ 匹配前一个字符出现1次或者0次，即要么有1次、要么没有
    # 用于匹配出0到99之间的数字
    ret = re.match(r"[1-9]?[0-9]", "7")
    print(ret.group())  # 7
    ret = re.match(r"[1-9]?\d", "33")
    print(ret.group())  # 33
    ret = re.match(r"[1-9]?\d", "09")
    print(ret.group())  # 0 说明匹配有问题

    print("-" * 50)

    # {m} 匹配前一个字符出现m次
    ret = re.match("[a-zA-Z0-9_]{6}", "12a3g45678")
    print(ret.group())  # 12a3g4
    # {m,n} 匹配前一个字符出现从m到n次
    ret = re.match("[a-zA-Z0-9_]{8,20}", "1ad12f23s*34455ff66")
    print(ret.group())  # 1ad12f23s


def start_end():
    # $ 匹配字符串结尾
    # 确定是否为邮箱地址
    email_list = ["xiaoWang@163.com", "xiaoWang@163.comheihei", ".com.xiaowang@qq.com"]
    for email in email_list:
        # \. 是转义字符
        # $ 确定字符串结尾，否则在有其他后缀的情况下也能匹配成功
        ret = re.match(r'\w{4,20}@163\.com$', email)  # 匹配的字符串中出现了正则的符号，要使用\进行转义
        if ret:
            print(f'{ret.group()}是正确的邮箱{email}')
        else:
            print(f'{email}邮箱地址不正确')

    print("-" * 50)
    # 匹配0到99,该方法仍然有问题
    ret = re.match(r"[1-9]?\d$", "0")
    if ret:
        print(ret.group())
    else:
        print('不是0-99之间')


def split_group():
    # | 匹配左右任意一个表达式
    # 匹配0到100
    ret = re.match(r"[1-9]?\d$|100", "100")
    if ret:
        print(ret.group())
    else:
        print('不是0-100之间')

    # 匹配1到99,匹配分组，依次匹配，写到前面的会先匹配
    # 前面用于匹配10-99，后面用于匹配1-9
    ret = re.match(r"[1-9][0-9]|[1-9]", "20")
    if ret:
        print(ret.group())
    else:
        print('不是1-99之间')

    print('-' * 50)

    # （字符串） 将括号中的字符串作为一个分组
    ret = re.match(r"\w{4,20}@(163|126|qq)\.com", "test@qq.com")
    print(ret.group())
    ret = re.match(r"\w{4,20}@(163|126|qq)\.com", "test@126.com")
    print(ret.group())

    print('-' * 50)

    # [^-]+ 代表没有遇到小横杠 - 就一直进行匹配，一直匹配下去
    ret = re.match(r"([^-]+)-(\d+)", "010-12345678")
    print(ret.group())
    print(ret.group(1))
    print(ret.group(2))

    print('-' * 50)

    # \num 引用第num个分组匹配到的字符串
    ret = re.match(r"<[a-zA-Z]*>\w*</[a-zA-Z]*>", "<html>hh</htmla>")
    print(ret.group())
    ret = re.match(r"<([a-zA-Z]*)>\w*</\1>", "<html>hh</html>")
    print(ret.group())

    print('-' * 50)

    labels = ["<html><h1>www.cskaoyan.com</h1></html>", "<html><h1>www.cskaoyan.com</h2></html>"]
    for label in labels:
        ret = re.match(r"<(\w*)><(\w*)>.*</\2></\1>", label)
        if ret:
            print("%s 是符合要求的标签" % ret.group())
        else:
            print("%s 不符合要求" % label)

    print('-' * 50)

    # (?P<name>) 分组起别名
    # (?P=name) 引用别名为name分组匹配到的字符串
    for label in labels:
        ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>", label)
        if ret:
            print("%s 是符合要求的标签" % ret.group())
        else:
            print("%s 不符合要求" % label)


if __name__ == '__main__':
    # simple_compare()
    # single_compare()
    # more_alp_compare()
    # start_end()
    split_group()
